package main

import (
	"fmt"
	"time"
)

func main() {
	var m = []int{11, 22, 33, 44, 55}

	// 在 Go 1.22 之前，for range 中 i,v 变量只会声明一次，且在每次迭代中会被重用
	// for i, v := range m {
	// 	go func() {
	// 		time.Sleep(time.Second * 3)
	// 		fmt.Printf("index-%d,%v,%p\n", i, v, &v)
	// 	}()
	// }

	// // 需要用下面这种方式，为闭包函数增加参数，在创建 Goroutine 时和本次迭代时的 i、v 值绑定
	// for i, v := range m {
	// 	go func(i, v int) {
	// 		time.Sleep(time.Second * 3)
	// 		fmt.Println(i, v)
	// 	}(i, v)
	// }

	// // 而从 Go 1.22 开始，每次迭代会创建新的循环变量（指针地址不同），解决闭包捕获的问题
	for i, v := range m {
		go func() {
			time.Sleep(time.Second * 3)
			fmt.Println(i, v)
		}()
	}

	time.Sleep(time.Second * 10)
}
